package hehe.log.base;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 * 输出目标
 *<B>说明：</B>
 *<pre>
 * 略
 *</pre>
 *<B>示例：</B>
 *<pre>
 *  略
 *</pre>
 *<B>日志：</B>
 *<pre>
 *  略
 *</pre>
 *<B>注意事项：</B>
 *<pre>
 *  略
 *</pre>
 */
abstract public class Target
{
    protected Format format = null;

    /**
     * 输出格式模板
     *<B>说明：</B>
     *<pre>
     * 略
     *</pre>
     */
    protected String formatTemplate = "";

    /**
     * 允许的日志级别
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    protected List<String> levels = new ArrayList();

    /**
     * 当前的日志列表
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    protected Vector<Message> msgs = new Vector<>();

    /**
     * 写入日志入口
     *<B>说明：</B>
     *<pre>
     *  由子类实现
     *</pre>
     */
    abstract public void write(Vector<Message> messages);

    public void init()
    {
        if (this.format == null) {
            this.format = new Format(this.formatTemplate);
        }
    }

    /**
     * 收集日志
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public void collect(Vector<Message> messages)
    {
        // 过滤消息
        messages = this.filterMessage(messages);

        // 写入内容
        this.write(messages);
    }

    /**
     * 过滤日志
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public Vector<Message> filterMessage(Vector<Message> messages)
    {
        Vector<Message> msgs =  new Vector<>();

        for (Message message:messages) {
            if (this.isPass(message)) {
                msgs.add(message);
            }
        }

        return msgs;
    }

    /**
     * 格式化日志
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public String formatMessage(Vector<Message> messages)
    {


        StringBuilder log = new StringBuilder();
        for (Message message: messages) {
            log.append(this.format.parse(message));
        }

        return log.toString();
    }

    /**
     * 日志是否通过过滤
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public boolean isPass(Message message)
    {
        if (levels == null || this.levels.size() == 0) {
            return true;
        }

        if (this.levels.contains(message.getLevel())) {
            return true;
        }

        return false;
    }
}
